package chapter07

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test01_ImmutableArray
 * Package: chapter07
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-06-25
 *          Time: 16:25
 */

//不可变数组
//数组最终还是一个引用对象
//不可变只的是引用对象的地址和最开始分配的地址空间
//所以对数组中的元素而言 可以修改和访问 不可增加删除(地址空间在变)
object Test01_ImmutableArray {
  def main(args: Array[String]): Unit = {
    //1.创建不可变数组 不可变 传一个大小的参数 类型可以自动推断
    val arr:Array[Int] = new Array[Int](5)

    //2.伴生对象 apply方法
    val arr2 = Array(12,54,56,78,98,32) //长度是6

    //访问元素
    println(arr(1))
    //println(arr(5)) 数组越界

    //赋值
    arr(0) = 55
    arr(0)
    println(arr(0))

    //遍历
    //1.普通循环
    println(arr2.length)
    for (i<-0 until  arr2.length){
      println(i)
    }

    //indices 就是封装好的 (0 until  arr2.length)
    for (i <- arr.indices) println(i)

    println("==========================")
    //2.增强for循环 直接遍历元素 不关心索引
    for (elem <- arr2){
      println(elem)
    }

    println("---------------------")
    //3.迭代器
    val inter = arr2.iterator
    while (inter.hasNext){
      println(inter.next())
    }

    //4.foreach方法调用 参数是一个函数 lambda表达式
    arr2.foreach((elem:Int) =>println(elem) )
    //函数至简原则
    arr2.foreach(println)

    //转换成String 参数是一个连接符
    println(arr2.mkString("--"))

    println("----------------------------------")

    //添加元素 生成一个新数组返回 末尾追加
    val newArr = arr2.:+(73)
    //底层获取arr2的长度 然后new一个新的数组长度+1 拷贝 在添加
    println(newArr.mkString(","))

    //最前添加
    val newArr1 = newArr.+:(99)
    println(newArr1.mkString(","))

    //运算符本质底层都是方法调用 .号的方法调用可以省略 用空格
    //如果只有一个参数 也可以去掉小括号 空格分开
    //简写方式 省去. 末尾追加
    val newArr2 = newArr1 :+ 15
    //开头追加 : 对着引用类型
    val newArr3 = 100 +: newArr2
    println(newArr3.mkString(","))


  }
}
